home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Database Designers / Rational Rose 2000 / Rational Setup.EXE / common / lib / MSWin32-x86 / CORE / XSUB.h < prev   
Encoding:
C/C++ Source or Header  |  1999-01-26  |  3.0 KB  |  94 lines

  1. #define ST(off) PL_stack_base[ax + (off)]
  2.  
  3. #ifdef CAN_PROTOTYPE
  4. #ifdef PERL_OBJECT
  5. #define XS(name) void name(CV* cv, CPerlObj* pPerl)
  6. #else
  7. #define XS(name) void name(CV* cv)
  8. #endif
  9. #else
  10. #define XS(name) void name(cv) CV* cv;
  11. #endif
  12.  
  13. #define dXSARGS                \
  14.     dSP; dMARK;            \
  15.     I32 ax = mark - PL_stack_base + 1;    \
  16.     I32 items = sp - mark
  17.  
  18. #define XSANY CvXSUBANY(cv)
  19.  
  20. #define dXSI32 I32 ix = XSANY.any_i32
  21.  
  22. #ifdef __cplusplus
  23. #  define XSINTERFACE_CVT(ret,name) ret (*name)(...)
  24. #else
  25. #  define XSINTERFACE_CVT(ret,name) ret (*name)()
  26. #endif
  27. #define dXSFUNCTION(ret)        XSINTERFACE_CVT(ret,XSFUNCTION)
  28. #define XSINTERFACE_FUNC(ret,cv,f)    ((XSINTERFACE_CVT(ret,))(f))
  29. #define XSINTERFACE_FUNC_SET(cv,f)    \
  30.         CvXSUBANY(cv).any_dptr = (void (*) _((void*)))(f)
  31.  
  32. #define XSRETURN(off)                    \
  33.     STMT_START {                    \
  34.     PL_stack_sp = PL_stack_base + ax + ((off) - 1);    \
  35.     return;                        \
  36.     } STMT_END
  37.  
  38. /* Simple macros to put new mortal values onto the stack.   */
  39. /* Typically used to return values from XS functions.       */
  40. #define XST_mIV(i,v)  (ST(i) = sv_2mortal(newSViv(v))  )
  41. #define XST_mNV(i,v)  (ST(i) = sv_2mortal(newSVnv(v))  )
  42. #define XST_mPV(i,v)  (ST(i) = sv_2mortal(newSVpv(v,0)))
  43. #define XST_mNO(i)    (ST(i) = &PL_sv_no   )
  44. #define XST_mYES(i)   (ST(i) = &PL_sv_yes  )
  45. #define XST_mUNDEF(i) (ST(i) = &PL_sv_undef)
  46.  
  47. #define XSRETURN_IV(v) STMT_START { XST_mIV(0,v);  XSRETURN(1); } STMT_END
  48. #define XSRETURN_NV(v) STMT_START { XST_mNV(0,v);  XSRETURN(1); } STMT_END
  49. #define XSRETURN_PV(v) STMT_START { XST_mPV(0,v);  XSRETURN(1); } STMT_END
  50. #define XSRETURN_NO    STMT_START { XST_mNO(0);    XSRETURN(1); } STMT_END
  51. #define XSRETURN_YES   STMT_START { XST_mYES(0);   XSRETURN(1); } STMT_END
  52. #define XSRETURN_UNDEF STMT_START { XST_mUNDEF(0); XSRETURN(1); } STMT_END
  53. #define XSRETURN_EMPTY STMT_START {                XSRETURN(0); } STMT_END
  54.  
  55. #define newXSproto(a,b,c,d)    sv_setpv((SV*)newXS(a,b,c), d)
  56.  
  57. #ifdef XS_VERSION
  58. # define XS_VERSION_BOOTCHECK \
  59.     STMT_START {                            \
  60.     SV *tmpsv;                            \
  61.     char *vn = Nullch, *module = SvPV(ST(0),PL_na);            \
  62.     if (items >= 2)     /* version supplied as bootstrap arg */    \
  63.         tmpsv = ST(1);                        \
  64.     else {                                \
  65.         /* XXX GV_ADDWARN */                    \
  66.         tmpsv = perl_get_sv(form("%s::%s", module,            \
  67.                   vn = "XS_VERSION"), FALSE);        \
  68.         if (!tmpsv || !SvOK(tmpsv))                    \
  69.         tmpsv = perl_get_sv(form("%s::%s", module,        \
  70.                       vn = "VERSION"), FALSE);        \
  71.     }                                \
  72.     if (tmpsv && (!SvOK(tmpsv) || strNE(XS_VERSION, SvPV(tmpsv, PL_na))))    \
  73.         croak("%s object version %s does not match %s%s%s%s %_",    \
  74.           module, XS_VERSION,                    \
  75.           vn ? "$" : "", vn ? module : "", vn ? "::" : "",    \
  76.           vn ? vn : "bootstrap parameter", tmpsv);        \
  77.     } STMT_END
  78. #else
  79. # define XS_VERSION_BOOTCHECK
  80. #endif
  81.  
  82. #ifdef PERL_OBJECT
  83. #include "objXSUB.h"
  84. #ifndef NO_XSLOCKS
  85. #ifdef WIN32
  86. #include "XSlock.h"
  87. #endif  /* WIN32 */
  88. #endif  /* NO_XSLOCKS */
  89. #else
  90. #ifdef PERL_CAPI
  91. #include "perlCAPI.h"
  92. #endif
  93. #endif    /* PERL_OBJECT */
  94.